梦想不会自己发光,真正闪耀的是那个为梦狂奔的你。献给知行的孩子们!(Eric.He著)
本教程将从 C++ 一维数组的核心概念、定义方式、引用方法、初始化规则,到数组越界风险和实际应用场景,全面拆解一维数组的核心用法,帮助你掌握这一基础且重要的编程工具。
数组(Array)是 C++ 中最基础的线性数据结构,用于批量存储相同数据类型的多个元素,这些元素在内存中连续存储,并通过「下标(索引)」快速访问。
一维数组是数组的最基础形式,可理解为:
0 开始计数);生活类比:一维数组如同电影院的一排座位,每个座位有唯一的编号(下标),且所有座位类型一致(均为“座位”),通过编号可快速找到对应座位。
一维数组的定义需明确「数据类型」「数组名」和「数组长度」,语法格式如下:
// 标准定义格式
数据类型 数组名[数组长度];
// 示例:定义一个能存储5个整数的一维数组
int arr[5];
// 说明:
// 1. 数据类型:指定数组存储元素的类型(int/float/char等)
// 2. 数组名:符合标识符规则的自定义名称(如arr、score、nums)
// 3. 数组长度:必须是「非负整数常量」(字面量、const常量,不可用变量)
// 1. 存储10个浮点型数据
float score[10];
// 2. 存储20个字符型数据
char name[20];
// 3. 使用const常量定义长度(推荐,增强可读性)
const int LEN = 8;
double price[LEN];
// 错误1:长度为变量(C++98不支持,C++11后需配合特定编译器设置)
int n = 5;
int arr[n];
// 错误2:长度为负数
int arr[-3];
// 错误3:长度为空
int arr[];
关键说明:C++ 11 标准后支持「变量长度数组(VLA)」,但属于编译器扩展特性(如GCC支持,MSVC不支持),不推荐使用;如需动态长度数组,建议使用STL的vector容器。
数组定义后,需通过「下标(索引)」访问单个元素,语法核心是 数组名[下标]。
// 读取元素值
数据类型 变量 = 数组名[下标];
// 修改元素值
数组名[下标] = 新值;
// 说明:
// 1. 下标从 0 开始,范围:0 ~ 数组长度-1
// 2. 下标可以是整数、整数变量、表达式
#include <iostream>
using namespace std;
int main() {
// 定义长度为5的整型数组
int arr[5];
// 1. 给数组元素赋值(逐个修改)
arr[0] = 10; // 第1个元素(下标0)
arr[1] = 20; // 第2个元素(下标1)
arr[2] = 30; // 第3个元素(下标2)
arr[3] = 40; // 第4个元素(下标3)
arr[4] = 50; // 第5个元素(下标4)
// 2. 读取并打印数组元素
cout << "arr[0] = " << arr[0] << endl;
cout << "arr[3] = " << arr[3] << endl;
// 3. 通过变量下标访问
int index = 2;
cout << "arr[" << index << "] = " << arr[index] << endl;
// 4. 通过表达式下标访问
cout << "arr[1+2] = " << arr[1+2] << endl;
return 0;
}
#include <iostream>
using namespace std;
int main() {
int arr[5] = {10, 20, 30, 40, 50};
// 方式1:for循环遍历(最常用)
cout << "数组元素:";
for (int i = 0; i < 5; i++) {
cout << arr[i] << " ";
}
cout << endl;
// 方式2:C++11 范围for循环(简化写法)
cout << "数组元素(范围for):";
for (int num : arr) {
cout << num << " ";
}
cout << endl;
return 0;
}
数组初始化是指在定义数组时直接为元素赋值,C++ 支持多种初始化方式,核心规则是「未显式赋值的元素会被默认初始化」。
初始化值的数量 等于 数组长度,为每个元素显式赋值。
// 完全初始化:5个元素全部赋值
int arr[5] = {1, 2, 3, 4, 5};
// 验证:遍历输出 1 2 3 4 5
for (int i = 0; i < 5; i++) {
cout << arr[i] << " ";
}
初始化值的数量 小于 数组长度,未赋值的元素会被默认初始化为 0(整型)/ 0.0(浮点型)/ '\0'(字符型)。
#include <iostream>
using namespace std;
int main() {
// 部分初始化:前2个元素赋值,后3个默认为0
int arr[5] = {10, 20};
// 输出:10 20 0 0 0
for (int i = 0; i < 5; i++) {
cout << arr[i] << " ";
}
cout << endl;
// 浮点型数组部分初始化:前2个赋值,后2个默认0.0
float score[4] = {90.5, 88.0};
// 输出:90.5 88 0 0
for (int i = 0; i < 4; i++) {
cout << score[i] << " ";
}
return 0;
}
定义数组时省略长度,编译器会根据初始化值的数量自动推导数组长度。
#include <iostream>
using namespace std;
int main() {
// 省略长度:编译器自动推导长度为4
int arr[] = {10, 20, 30, 40};
// 计算数组长度:sizeof(数组)/sizeof(单个元素)
int len = sizeof(arr) / sizeof(arr[0]);
cout << "数组长度:" << len << endl; // 输出:4
cout << "数组元素:";
for (int i = 0; i < len; i++) {
cout << arr[i] << " "; // 输出:10 20 30 40
}
return 0;
}
仅写一个 0 作为初始化值,数组所有元素都会被初始化为 0(最常用的清空数组方式)。
#include <iostream>
using namespace std;
int main() {
// 全部初始化为0:长度10的数组,所有元素都是0
int arr[10] = {0};
// 输出:0 0 0 0 0 0 0 0 0 0
for (int i = 0; i < 10; i++) {
cout << arr[i] << " ";
}
return 0;
}
初始化禁忌:初始化值的数量 不能超过 数组长度,否则编译器直接报错(如 int arr[3] = {1,2,3,4}; 非法)。
数组越界是指访问的下标超出 0 ~ 数组长度-1 的合法范围,这是 C++ 中最常见的编程错误之一。
#include <iostream>
using namespace std;
int main() {
int arr[3] = {1, 2, 3};
// 合法范围:0、1、2
cout << arr[2] << endl; // 合法:输出3
// 非法:下标3超出范围(越界访问)
cout << arr[3] << endl; // 输出随机值(未定义行为)
// 非法:越界修改(可能导致程序崩溃)
arr[5] = 100;
return 0;
}
i < len,而非 i <= len);sizeof(arr)/sizeof(arr[0]) 动态计算数组长度,避免硬编码;vector 容器(自带边界检查);assert(i >= 0 && i < len))。
#include <iostream>
#include <cassert> // 引入断言头文件
using namespace std;
int main() {
int arr[5] = {1,2,3,4,5};
int len = sizeof(arr)/sizeof(arr[0]);
for (int i = 0; i < len; i++) {
// 断言:确保下标合法,非法时直接终止程序并提示
assert(i >= 0 && i < len);
cout << arr[i] << " ";
}
return 0;
}
一维数组是处理「批量同类型数据」的核心工具,以下是典型应用场景:
#include <iostream>
using namespace std;
int main() {
// 存储5名学生的成绩
int scores[5] = {85, 92, 78, 90, 88};
int sum = 0; // 总分
int maxScore = 0; // 最高分
int minScore = 100;// 最低分
int len = sizeof(scores)/sizeof(scores[0]);
for (int i = 0; i < len; i++) {
sum += scores[i]; // 累加总分
if (scores[i] > maxScore) {
maxScore = scores[i]; // 更新最高分
}
if (scores[i] < minScore) {
minScore = scores[i]; // 更新最低分
}
}
// 计算平均分(强制浮点型)
float avg = (float)sum / len;
// 输出结果
cout << "总分:" << sum << endl; // 433
cout << "平均分:" << avg << endl; // 86.6
cout << "最高分:" << maxScore << endl; // 92
cout << "最低分:" << minScore << endl; // 78
return 0;
}
#include <iostream>
using namespace std;
int main() {
int arr[6] = {34, 7, 23, 32, 5, 62};
int len = sizeof(arr)/sizeof(arr[0]);
// 冒泡排序:升序排列
for (int i = 0; i < len - 1; i++) {
for (int j = 0; j < len - 1 - i; j++) {
if (arr[j] > arr[j+1]) {
// 交换相邻元素
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
// 输出排序结果:5 7 23 32 34 62
cout << "排序后数组:";
for (int num : arr) {
cout << num << " ";
}
return 0;
}
#include <iostream>
using namespace std;
// 线性查找函数:找到返回下标,未找到返回-1
int findElement(int arr[], int len, int target) {
for (int i = 0; i < len; i++) {
if (arr[i] == target) {
return i; // 找到目标,返回下标
}
}
return -1; // 未找到
}
int main() {
int arr[5] = {10, 20, 30, 40, 50};
int len = sizeof(arr)/sizeof(arr[0]);
int target = 30;
int index = findElement(arr, len, target);
if (index != -1) {
cout << "找到 " << target << ",下标为:" << index << endl;
} else {
cout << "未找到 " << target << endl;
}
return 0;
}
vector);arr = new int[5]; 非法);void func(int arr[], int len));assert 断言。数组名[下标] 访问元素;本教程从 C++ 一维数组的核心概念、定义、引用、初始化,到越界风险和实际应用,全面拆解了一维数组的核心用法。掌握一维数组的运用,是学习数据结构的重要基础之一。